home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / ECVEC.ASM < prev    next >
Assembly Source File  |  1988-04-16  |  4KB  |  204 lines

  1.     include lmacros.h
  2.  
  3. ; Conditional ES save/restore macros not in lmacros.h
  4. pushes    macro
  5.     ifdef LONGPTR
  6.     push    es
  7.     endif
  8.     endm
  9.  
  10. popes    macro
  11.     ifdef LONGPTR
  12.     pop    es
  13.     endif
  14.     endm
  15.  
  16.     assume    ds:dataseg
  17.     assume    cs:codeseg
  18.     public    sssave,spsave,intstk
  19.  
  20.     ifdef    FARPROC
  21.     extrn    doret:far,ecint_:far,getintds:far
  22.     else
  23.     extrn    doret:near,ecint_:near,getintds:near
  24.     endif
  25.  
  26. ; ec0vec - Ethernet interrupt handler
  27.     public    ec0vec_
  28.  
  29. ec0vec_ proc    far
  30.     push    ds        ; save on user stack
  31.     call    getintds    ; establish interrupt data segment
  32.  
  33.     mov    ds:sssave,ss    ; stash user stack context
  34.     mov    ds:spsave,sp
  35.  
  36.     push    ds
  37.     pop    ss
  38.     lea    sp,intstk+512
  39.  
  40.     push    ax        ; save user regs on interrupt stack
  41.     push    bx
  42.     push    cx
  43.     push    dx
  44.     push    bp
  45.     push    si
  46.     push    di
  47.     push    es
  48.     push    ds
  49.     pop    es
  50.  
  51.     mov    ax,0        ; arg for service routine
  52.     push    ax
  53.     call    ecint_
  54.     pop    ax
  55.     jmp    doret
  56. ec0vec_    endp
  57.  
  58. ; ec1vec - Ethernet interrupt handler
  59.     public    ec1vec_
  60.  
  61. ec1vec_ proc    far
  62.     push    ds        ; save on user stack
  63.     call    getintds    ; establish interrupt data segment
  64.  
  65.     mov    ds:sssave,ss    ; stash user stack context
  66.     mov    ds:spsave,sp
  67.  
  68.     push    ds
  69.     pop    ss
  70.     lea    sp,intstk+512
  71.  
  72.     push    ax        ; save user regs on interrupt stack
  73.     push    bx
  74.     push    cx
  75.     push    dx
  76.     push    bp
  77.     push    si
  78.     push    di
  79.     push    es
  80.     push    ds
  81.     pop    es
  82.  
  83.     mov    ax,1        ; arg for service routine
  84.     push    ax
  85.     call    ecint_
  86.     pop    ax
  87.     jmp    doret
  88. ec1vec_    endp
  89.  
  90. ; ec2vec - Ethernet interrupt handler
  91.     public    ec2vec_
  92.  
  93. ec2vec_ proc    far
  94.     push    ds        ; save on user stack
  95.     call    getintds    ; establish interrupt data segment
  96.  
  97.     mov    ds:sssave,ss    ; stash user stack context
  98.     mov    ds:spsave,sp
  99.  
  100.     push    ds
  101.     pop    ss
  102.     lea    sp,intstk+512
  103.  
  104.     push    ax        ; save user regs on interrupt stack
  105.     push    bx
  106.     push    cx
  107.     push    dx
  108.     push    bp
  109.     push    si
  110.     push    di
  111.     push    es
  112.     push    ds
  113.     pop    es
  114.  
  115.     mov    ax,2        ; arg for service routine
  116.     push    ax
  117.     call    ecint_
  118.     pop    ax
  119.     jmp    doret
  120. ec2vec_    endp
  121.  
  122. ; fast buffer I/O routines -- used by 3-COM Ethernet controller
  123.  
  124. ; outbuf - put a buffer to an output port
  125.     procdef outbuf,<<oport,word>,<obuf,ptr>,<ocnt,word>>
  126.     pushf
  127.     push    si
  128.     pushds
  129.     mov    dx,oport
  130.     mov    cx,ocnt
  131.     ldptr    si,obuf,ds    ; ds:si = obuf
  132.     cld
  133.  
  134. ; If buffer doesn't begin on a word boundary, send the first byte
  135.     test    si,1    ; (buf & 1) ?
  136.     jz    obufeven ; no
  137.     lodsb        ; al = *si++;
  138.     out    dx,al    ; out(dx,al);
  139.     dec    cx    ; cx--;
  140.     mov    ocnt,cx    ; save for later test
  141. obufeven:
  142.     shr    cx,1    ; cx = cnt >> 1; (convert to word count)
  143. ; Do the bulk of the buffer, a word at a time
  144.     jcxz    onobuf    ; if(cx != 0){
  145. xb:    lodsw        ; do { ax = *si++; (si is word pointer)
  146.     out    dx,al    ; out(dx,lowbyte(ax));
  147.     mov    al,ah
  148.     out    dx,al    ; out(dx,hibyte(ax));
  149.     loop    xb    ; } while(--cx != 0); }
  150. ; now check for odd trailing byte
  151. onobuf:    mov    cx,ocnt
  152.     test    cx,1
  153.     jz    ocnteven
  154.     lodsb        ; al = *si++;
  155.     out    dx,al
  156. ocnteven:
  157.     popds
  158.     pop    si
  159.     popf
  160.     pret
  161.     pend    outbuf
  162.  
  163. ; inbuf - get a buffer from an input port
  164.     procdef inbuf,<<iport,word>,<ibuf,ptr>,<icnt,word>>
  165.     pushf
  166.     push    di
  167.     pushes
  168.     mov    dx,iport
  169.     mov    cx,icnt
  170.     ldptr    di,ibuf,es    ; es:di = ibuf (es already set in small model)
  171.     cld
  172.  
  173. ; If buffer doesn't begin on a word boundary, get the first byte
  174.     test    di,1    ; if(buf & 1){
  175.     jz    ibufeven ;
  176.     in    al,dx    ; al = in(dx);
  177.     stosb        ; *di++ = al
  178.     dec    cx    ; cx--;
  179.     mov    icnt,cx    ; icnt = cx; } save for later test
  180. ibufeven:
  181.     shr    cx,1    ; cx = cnt >> 1; (convert to word count)
  182. ; Do the bulk of the buffer, a word at a time
  183.     jcxz    inobuf    ; if(cx != 0){
  184. rb:    in    al,dx    ; do { al = in(dx);
  185.     mov    ah,al
  186.     in    al,dx    ; ah = in(dx);
  187.     xchg    al,ah
  188.     stosw        ; *si++ = ax; (di is word pointer)
  189.     loop    rb    ; } while(--cx != 0);
  190. ; now check for odd trailing byte
  191. inobuf:    mov    cx,icnt
  192.     test    cx,1
  193.     jz    icnteven
  194.     in    al,dx
  195.     stosb        ; *di++ = al
  196. icnteven:
  197.     popes
  198.     pop    di
  199.     popf
  200.     pret
  201.     pend    inbuf
  202.  
  203.     end
  204.